home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / nasm095s.zip / RDOFF / RDFDUMP.C < prev    next >
C/C++ Source or Header  |  1997-07-27  |  4KB  |  157 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. FILE *infile;
  6.  
  7. long translatelong(long in) {        /* translate from little endian to
  8.                        local representation */
  9.   long r;
  10.   unsigned char *i;
  11.  
  12.   i = (unsigned char *)∈
  13.   r = i[3];
  14.   r = (r << 8) + i[2];
  15.   r = (r << 8) + i[1];
  16.   r = (r << 8) + *i;
  17.  
  18.   return r;
  19. }
  20.   
  21. int translateshort(short in) {
  22.   int r;
  23.   unsigned char *i;
  24.  
  25.   i = (unsigned char *)∈
  26.   r = (i[1] << 8) + *i;
  27.  
  28.   return r;
  29. }
  30. void print_header(long length) {
  31.   char buf[129],t,s,l;
  32.   long o,ll;
  33.   short rs;
  34.  
  35.   while (length > 0) {
  36.     fread(&t,1,1,infile);
  37.     switch(t) {
  38.     case 1:        /* relocation record */
  39.       fread(&s,1,1,infile);
  40.       fread(&o,4,1,infile);
  41.       fread(&l,1,1,infile);
  42.       fread(&rs,2,1,infile); 
  43.       printf("  relocation: location (%04x:%08lx), length %d, "
  44.          "referred seg %04x\n",(int)s,translatelong(o),(int)l,
  45.          translateshort(rs));
  46.       length -= 9;
  47.       break;
  48.     case 2:             /* import record */
  49.       fread(&rs,2,1,infile);
  50.       ll = 0;
  51.       do {
  52.     fread(&buf[ll],1,1,infile);
  53.       } while (buf[ll++]);
  54.       printf("  import: segment %04x = %s\n",translateshort(rs),buf);
  55.       length -= ll + 3;
  56.       break;
  57.     case 3:             /* export record */
  58.       fread(&s,1,1,infile);
  59.       fread(&o,4,1,infile);
  60.       l = 0;
  61.       do {
  62.     fread(&buf[ll],1,1,infile);
  63.       } while (buf[ll++]);
  64.       printf("  export: (%04x:%08lx) = %s\n",(int)s,translatelong(o),buf);
  65.       length -= ll + 6;
  66.       break;
  67.     case 4:        /* DLL record */
  68.       l = 0;
  69.       do {
  70.     fread(&buf[ll],1,1,infile);
  71.       } while (buf[ll++]);
  72.       printf("  dll: %s\n",buf);
  73.       length -= ll + 1;
  74.       break;
  75.     case 5:        /* BSS reservation */
  76.       fread(&ll,4,1,infile);
  77.       printf("  bss reservation: %08lx bytes\n",translatelong(ll));
  78.       length -= 5;
  79.       break;
  80.     default:
  81.       printf("  unrecognised record (type %d)\n",(int)t);
  82.       length --;
  83.     }
  84.   }
  85. }
  86.  
  87. int main(int argc,char **argv) {
  88.   char id[7];
  89.   long l;
  90.   int verbose = 0;
  91.  
  92.   puts("RDOFF Dump utility v1.1 (C) Copyright 1996 Julian R Hall");
  93.  
  94.   if (argc < 2) {
  95.     fputs("Usage: rdfdump [-v] <filename>\n",stderr);
  96.     exit(1);
  97.   }
  98.  
  99.   if (! strcmp (argv[1], "-v") )
  100.   {
  101.     verbose = 1;
  102.     if (argc < 3)
  103.     {
  104.       fputs("required parameter missing\n",stderr);
  105.       exit(1);
  106.     }
  107.     argv++;
  108.   }
  109.  
  110.   infile = fopen(argv[1],"rb");
  111.   if (! infile) {
  112.     fprintf(stderr,"rdfdump: Could not open %s",argv[1]);
  113.     exit(1);
  114.   }
  115.  
  116.   fread(id,6,1,infile);
  117.   if (strncmp(id,"RDOFF",5)) {
  118.     fputs("rdfdump: File does not contain valid RDOFF header\n",stderr);
  119.     exit(1);
  120.   }
  121.  
  122.   printf("File %s: RDOFF version %c\n\n",argv[1],id[5]);
  123.   if (id[5] < '1' || id[5] > '1') {
  124.     fprintf(stderr,"rdfdump: unknown RDOFF version '%c'\n",id[5]);
  125.     exit(1);
  126.   }
  127.  
  128.   fread(&l,4,1,infile);
  129.   l = translatelong(l);
  130.   printf("Header (%ld bytes):\n",l);
  131.   print_header(l);
  132.  
  133.   fread(&l,4,1,infile);
  134.   l = translatelong(l);
  135.   printf("\nText segment length = %ld bytes\n",l);
  136.   while(l--) {
  137.     fread(id,1,1,infile);
  138.     if (verbose) printf("  %02x",(int) (unsigned char)id[0]);
  139.   }
  140.   if (verbose) printf("\n\n");
  141.  
  142.   fread(&l,4,1,infile);
  143.   l = translatelong(l);
  144.   printf("Data segment length = %ld bytes\n",l);
  145.  
  146.   if (verbose)
  147.   {
  148.     while (l--) {
  149.       fread(id,1,1,infile);
  150.       printf("  %02x",(int) (unsigned char) id[0]);
  151.     }
  152.     printf("\n");
  153.   }
  154.   fclose(infile);
  155.   return 0;
  156. }
  157.